/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SintaticoPacote;

import SintaticoPacote.TratamentoErro.ErroSintaticoInterface;
import SintaticoPacote.TratamentoErro.ErroTabela;
import SintaticoPacote.TratamentoErro.TabelaErros;
import compilador_full.TabelaSimbolos;
import java.util.ArrayList;

/**
 *
 * @author Loreno
 */
public class declaracaoBibliotecas implements ErroSintaticoInterface{

    ArrayList<String> sincronizadores = new ArrayList<String>();

    public declaracaoBibliotecas(){
        carregaSincronizadores();
    }

    public void carregaSincronizadores(){
        sincronizadores.add("int");
        sincronizadores.add("float");
        sincronizadores.add("char");
        sincronizadores.add("boolean");
        sincronizadores.add("void");
        sincronizadores.add("*");
        sincronizadores.add("include");
        

    }

    public boolean declaraBibliotecas(TabelaSimbolos tabelasimbolos) {

        tabelasimbolos.reconhecer("include");

            if(!tabelasimbolos.reconhecer("<")) {
                System.out.println("Erro: falta o <");
                System.out.println(tabelasimbolos.getLookahead());
                this.recuperaErro(0, tabelasimbolos, "", sincronizadores);
                System.out.println(tabelasimbolos.getLookahead());
                ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " < esperado");
                TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                return false;
            }

                if(!tabelasimbolos.getTipo().equals("identificador")){
                    System.out.println("Erro: falta o identificador");
                    this.recuperaErro(0, tabelasimbolos, "", sincronizadores);
                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " identificador esperado");
                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                    return false;
                }
                    if(!tabelasimbolos.reconhecer(tabelasimbolos.getLookahead())) {
                        System.out.println("erro1");
                        this.recuperaErro(0, tabelasimbolos, "Erro: falta : ", sincronizadores);
                        return false;
                    }
                        if(!tabelasimbolos.reconhecer("."))
                        {
                            System.out.println("erro1");
                            this.recuperaErro(0, tabelasimbolos, "", sincronizadores);
                            ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " . esperado");
                            TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                            return false;
                        }

                            if (!tabelasimbolos.reconhecer("h")) {
                                System.out.println("erro1");
                                this.recuperaErro(0, tabelasimbolos, "", sincronizadores);
                                ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " h esperado");
                                TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                return false;
                            }
                                if (!tabelasimbolos.reconhecer(">")) {
                                    System.out.println("erro1");
                                    this.recuperaErro(0, tabelasimbolos, "", sincronizadores);
                                    ErroTabela erro = new ErroTabela(tabelasimbolos.getLinha(), "Erro na linha " + tabelasimbolos.getLinha() + " > esperado");
                                    TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.
                                    return false;
                                }
                                    return true;
//                                } else { DO >
//                                    return false;
//                                }
//                            } else { do h
//                                return false;
//                            }
//                        } else { era do ponto
//                            return false;
//                        }
//                    } else {
//                        return false;
//                    }
//                } else {
//                    return false;
//                }
//            } else {    esse era o else do if <
//                return false;
//            }
//        } else {
//            return false;
//        }
    }

    public void recuperaErro(int posicao, TabelaSimbolos tabelaSimbolos, String descricaoErro, ArrayList<String> sincronizadores) {
         ErroTabela erro = new ErroTabela(0, descricaoErro);
        TabelaErros.getInstance().getTabelaErros().add(erro);// Tabela de Erros ja contem o erro. Isso que será impresso na tela.

        while(!isSincronizador(tabelaSimbolos.getLookahead(), tabelaSimbolos.getTipo(), sincronizadores)){
            tabelaSimbolos.soConsome();

        }
    }

   

    public boolean isSincronizador(String token, String tipo, ArrayList<String> sincronizadores) {
        for(int i = 0 ; i < sincronizadores.size() ; i++){
            if(sincronizadores.get(i).equals(token) ||sincronizadores.get(i).equals(tipo) ){
                System.out.println("ENCONTROU UM SINCRONIZADOR " + sincronizadores.get(i));
                return true;
            }
        }
        return false;
    }
}
